package main

/**
Go语言中的 map 在并发情况下，只读是线程安全的，同时读写线程不安全。

运行时输出提示：并发的 map 读写。也就是说使用了两个并发函数不断地对 map 进行读和写而发生了竞态问题。map 内部会对这种并发操
作进行检查并提前发现。

需要并发读写时，一般的做法是加锁，但这样性能并不高。Go语言在 1.9 版本中提供了一种效率较高的并发安全的 sync.Map。sync.Map
和 map 不同，不是以语言原生形态提供，而是在 sync 包下的特殊结构。
*/
func main() {
	// 创建一个int到int的映射
	m := make(map[int]int)
	// 开启一段并发代码
	go func() {
		// 不停地对map进行写入
		for {
			m[1] = 1
		}
	}()
	// 开启一段并发代码
	go func() {
		// 不停地对map进行读取
		for {
			_ = m[1]
		}
	}()
	// 无限循环, 让并发程序在后台执行
	for {
	}
}
